#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：备忘录模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:26 
"""

"""
备忘录模式 (Memento Pattern)
备忘录模式是一种行为型设计模式，它允许在不破坏封装性的前提下捕获一个对象的内部状态，并在需要时将其恢复。备忘录模式通常涉及三个角色：原发器（Originator）、备忘录（Memento）和管理者（Caretaker）。

在 Python 中，备忘录模式通常通过将对象状态保存到备忘录对象中，并通过管理者对象来管理备忘录的创建、存储和恢复。以下是一个简单的示例：

在这个示例中，Memento 是备忘录类，用于保存原发器的状态。Originator 是原发器类，负责创建备忘录对象并保存、恢复自身状态。Caretaker 是管理者类，负责存储备忘录对象。

在客户端代码中，创建原发器对象和管理者对象，通过原发器对象设置状态并创建备忘录，然后将备忘录交给管理者保存。在需要恢复状态时，从管理者获取备忘录并交给原发器进行恢复操作。

备忘录模式适用于需要保存和恢复对象状态的情况，尤其是当对象的状态需要在某些时间点进行快照保存，并在需要时进行恢复。通过使用备忘录模式，可以实现状态的封装和恢复，同时也能保持原发器
"""


class Memento:
	def __init__(self, state):
		self._state = state

	def get_state(self):
		return self._state


class Originator:
	def __init__(self):
		self._state = ""

	def set_state(self, state):
		print(f"设置状态为: {state}")
		self._state = state

	def save_to_memento(self):
		print("保存状态到备忘录")
		return Memento(self._state)

	def restore_from_memento(self, memento):
		print("从备忘录恢复状态")
		self._state = memento.get_state()


class Caretaker:
	def __init__(self):
		self._mementos = []

	def add_memento(self, memento):
		print("添加备忘录到管理器")
		self._mementos.append(memento)

	def get_memento(self, index):
		print("从管理器获取备忘录")
		return self._mementos[index]


if __name__ == "__main__":
	originator = Originator()
	caretaker = Caretaker()

	originator.set_state("状态1")
	caretaker.add_memento(originator.save_to_memento())

	originator.set_state("状态2")
	caretaker.add_memento(originator.save_to_memento())

	originator.set_state("状态3")

	originator.restore_from_memento(caretaker.get_memento(1))
